home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / crc_lib2 / src / crc_16c.s < prev    next >
Encoding:
Text File  |  1995-01-08  |  6.1 KB  |  198 lines

  1. ;--------------------------------------------------------------------------
  2. ;        CRC_16C.S
  3. ;        Assemblerroutinen (68000er) zur CRC-Berechnung;
  4. ;
  5. ;        (c) 1994 by Jan Kriesten, D-35043 Marburg, FidoNet: 2:244/4344
  6. ;
  7. ;        Die CRC-Tabelle fr CRC-CCITT ist hier enthalten;
  8. ;
  9.  
  10.     *** CRC-CCITT
  11.     .GLOBL    Crc16cStr, Crc16cBlk, Crc16cUpd, Crc16cBlkUpd
  12.     .GLOBL    Crc16cShort
  13.     .GLOBL    Crc16cTab
  14.  
  15.     .TEXT
  16.  
  17. ;--------------------------------------------------------------------------
  18. ;        Routinen zur CRC-16 Berechnung (CRC-CCITT V.41)
  19. ;        Polynom: x^16+x^12+x^5+1
  20. ;        Die Berechnung wird mit Hilfe einer Tabelle durchgefhrt, so daž
  21. ;        8 BIT gleichzeitig herangezogen werden k”nnen.
  22.  
  23.  
  24.     .MODULE Crc16cStr
  25.     
  26. ;        ->    a0:    - Adresse eines nullterminierten Strings;
  27. ;        <-    d0:    - CRC-CCITT V.41 ( 2 Byte unsigned );
  28.  
  29.         clr.w        d0                    ; d0 l”schen.
  30.         lea.l        Crc16cTab(pc), a1    ; Adresse der CRC-Tabelle nach a1.
  31.  
  32.         bra.b        .LoopStart
  33.  
  34. .Loop:
  35.         ror.w        #8, d0            ;
  36.         eor.b        d0, d1            ; x = ( crc >> 8 ) XOR (*msg)
  37.         add.w        d1, d1            ; mal 2, da auf Wortbreite adressiert wird!
  38.         move.w        (a1,d1.w), d1    ; entsprechender Tabelleneintrag nach d1
  39.  
  40.         clr.b        d0                ;
  41.         eor.w        d1, d0            ; y = (crc << 8) XOR x
  42.  
  43. .LoopStart:
  44.         moveq        #0, d1            ;
  45.         move.b        (a0)+, d1        ; erstes Byte des Strings nach d1 ...
  46.         bne.b        .Loop            ; wenn d2 != 0, dann geht's weiter
  47.  
  48.         rts                            ; und zurck! 
  49.         
  50.     .ENDMOD
  51.  
  52.     .MODULE Crc16cBlk
  53.  
  54. ;        ->    a0:    - Adresse eines Datenblockes;
  55. ;            d0:    - L„nge des Datenblockes ( 4 Bytes unsigned )
  56. ;        <-    d0:    - CRC-CCITT V.41 ( 2 Byte unsigned );
  57.  
  58.         move.l        d0, d1            ; counter in d1 initialisieren
  59.         clr.w        d0                ; d0 l”schen
  60.  
  61.         cmp.l        #$ffff.w, d1    ; wenn die L„nge WORD ist
  62.         blo.w        Crc16cShort        ; dann dbra benutzen
  63.  
  64.         bra.w        Crc16cBlkUpd
  65.  
  66.     .ENDMOD
  67.  
  68.     .MODULE Crc16cBlkUpd
  69.  
  70. ;        ->    a0:    - Adresse eines Datenblockes;
  71. ;            d0: - bisherige CRC-CCITT V.41
  72. ;            d1:    - L„nge des Datenblockes ( 4 Bytes unsigned )
  73. ;        <-    d0:    - CRC-CCITT V.41 ( 2 Byte unsigned );
  74.  
  75.         cmp.l        #$ffff.w, d1        ; wenn die L„nge WORD ist
  76.         blo.w        Crc16cShort            ; dann dbra benutzen
  77.  
  78.         move.l        d1, d2                ; counter in d2 initialisieren
  79.  
  80.         lea.l        Crc16cTab(pc), a1    ; Adresse der CRC-Tabelle nach a1.
  81.  
  82.         bra.b        .LoopStart
  83.  
  84. .Loop:
  85.         moveq        #0, d1            ;
  86.         move.b        (a0)+, d1        ; Zeichen holen
  87.         
  88.         ror.w        #8, d0            ;
  89.         eor.b        d0, d1            ; x = ( crc >> 8 ) XOR (*msg)
  90.         add.w        d1, d1            ; mal 2, da auf word adressiert wird!
  91.         move.w        (a1,d1.w), d1    ; entsprechender Tabelleneintrag nach d1
  92.  
  93.         clr.b        d0                ;
  94.         eor.w        d1, d0            ; y = (crc << 8) XOR x
  95.  
  96. .LoopStart:
  97.         subq.l        #1, d2            ; counter um 1 erniedrigen
  98.         bpl.b        .Loop            ; wenn d2 >= 0, dann geht's weiter
  99.  
  100.         rts                            ; und zurck! 
  101.  
  102.     .ENDMOD
  103.  
  104.     .MODULE Crc16cShort
  105.  
  106. ;        ->    a0:    - Adresse eines Datenblockes;
  107. ;            d0: - bisherige CRC-16
  108. ;            d1:    - L„nge des Datenblockes ( 2 Bytes signed )
  109. ;        <-    d0:    - CRC-16 ( 2 Byte unsigned );
  110.  
  111.         move.l        d1, d2                ; counter in d2 initialisieren
  112.  
  113.         lea.l        Crc16cTab(pc), a1    ; Adresse der CRC-Tabelle nach a1.
  114.  
  115.         bra.b        .LoopStart
  116.  
  117. .Loop:
  118.         moveq        #0, d1            ;
  119.         move.b        (a0)+, d1        ; Zeichen holen
  120.         
  121.         ror.w        #8, d0            ;
  122.         eor.b        d0, d1            ; x = ( crc >> 8 ) XOR (*msg)
  123.         add.w        d1, d1            ; mal 2, da auf word adressiert wird!
  124.         move.w        (a1,d1.w), d1    ; entsprechender Tabelleneintrag nach d1
  125.  
  126.         clr.b        d0                ;
  127.         eor.w        d1, d0            ; y = (crc << 8) XOR x
  128.  
  129. .LoopStart:
  130.         dbra        d2, .Loop        ; counter um 1 erniedrigen und 
  131.                                     ; bis -1
  132.         rts                            ; und zurck!
  133.  
  134.     .ENDMOD
  135.         
  136.     .MODULE Crc16cUpd
  137.  
  138. ;        ->    d0:    - bisheriger CRC-CCITT V.41 (2 Byte unsigned;
  139. ;            d1:    - hinzuzufgendes Byte;
  140. ;        <-    d0:    - CRC-CCITT V.41 ( 2 Byte unsigned );
  141.  
  142.         lea.l        Crc16cTab(pc), a0    ; Adresse der CRC-Tabelle nach a1.
  143.  
  144.         ror.w        #8, d0            ;
  145.         
  146.         andi.w        #$00ff, d1        ; oberes Byte ausmaskieren
  147.         eor.b        d0, d1            ; x = ( crc >> 8 ) XOR (*msg)
  148.         add.w        d1, d1            ; mal 2, da auf word adressiert wird!
  149.         move.w        (a0,d1.w), d1    ; entsprechender Tabelleneintrag nach d1
  150.  
  151.         clr.b        d0                ;
  152.         eor.w        d1, d0            ; y = (crc << 8) XOR x
  153.  
  154.         rts                            ; und zurck! 
  155.         
  156.     .ENDMOD
  157.  
  158. ;--------------------------------------------------------------------------
  159.  
  160.     .MODULE Crc16cTab:
  161.     
  162.         dc.w $0000, $1021, $2042, $3063, $4084, $50a5, $60c6, $70e7
  163.         dc.w $8108, $9129, $a14a, $b16b, $c18c, $d1ad, $e1ce, $f1ef
  164.         dc.w $1231, $0210, $3273, $2252, $52b5, $4294, $72f7, $62d6
  165.         dc.w $9339, $8318, $b37b, $a35a, $d3bd, $c39c, $f3ff, $e3de
  166.         dc.w $2462, $3443, $0420, $1401, $64e6, $74c7, $44a4, $5485
  167.         dc.w $a56a, $b54b, $8528, $9509, $e5ee, $f5cf, $c5ac, $d58d
  168.         dc.w $3653, $2672, $1611, $0630, $76d7, $66f6, $5695, $46b4
  169.         dc.w $b75b, $a77a, $9719, $8738, $f7df, $e7fe, $d79d, $c7bc
  170.         dc.w $48c4, $58e5, $6886, $78a7, $0840, $1861, $2802, $3823
  171.         dc.w $c9cc, $d9ed, $e98e, $f9af, $8948, $9969, $a90a, $b92b
  172.         dc.w $5af5, $4ad4, $7ab7, $6a96, $1a71, $0a50, $3a33, $2a12
  173.         dc.w $dbfd, $cbdc, $fbbf, $eb9e, $9b79, $8b58, $bb3b, $ab1a
  174.         dc.w $6ca6, $7c87, $4ce4, $5cc5, $2c22, $3c03, $0c60, $1c41
  175.         dc.w $edae, $fd8f, $cdec, $ddcd, $ad2a, $bd0b, $8d68, $9d49
  176.         dc.w $7e97, $6eb6, $5ed5, $4ef4, $3e13, $2e32, $1e51, $0e70
  177.         dc.w $ff9f, $efbe, $dfdd, $cffc, $bf1b, $af3a, $9f59, $8f78
  178.         dc.w $9188, $81a9, $b1ca, $a1eb, $d10c, $c12d, $f14e, $e16f
  179.         dc.w $1080, $00a1, $30c2, $20e3, $5004, $4025, $7046, $6067
  180.         dc.w $83b9, $9398, $a3fb, $b3da, $c33d, $d31c, $e37f, $f35e
  181.         dc.w $02b1, $1290, $22f3, $32d2, $4235, $5214, $6277, $7256
  182.         dc.w $b5ea, $a5cb, $95a8, $8589, $f56e, $e54f, $d52c, $c50d
  183.         dc.w $34e2, $24c3, $14a0, $0481, $7466, $6447, $5424, $4405
  184.         dc.w $a7db, $b7fa, $8799, $97b8, $e75f, $f77e, $c71d, $d73c
  185.         dc.w $26d3, $36f2, $0691, $16b0, $6657, $7676, $4615, $5634
  186.         dc.w $d94c, $c96d, $f90e, $e92f, $99c8, $89e9, $b98a, $a9ab
  187.         dc.w $5844, $4865, $7806, $6827, $18c0, $08e1, $3882, $28a3
  188.         dc.w $cb7d, $db5c, $eb3f, $fb1e, $8bf9, $9bd8, $abbb, $bb9a
  189.         dc.w $4a75, $5a54, $6a37, $7a16, $0af1, $1ad0, $2ab3, $3a92
  190.         dc.w $fd2e, $ed0f, $dd6c, $cd4d, $bdaa, $ad8b, $9de8, $8dc9
  191.         dc.w $7c26, $6c07, $5c64, $4c45, $3ca2, $2c83, $1ce0, $0cc1
  192.         dc.w $ef1f, $ff3e, $cf5d, $df7c, $af9b, $bfba, $8fd9, $9ff8
  193.         dc.w $6e17, $7e36, $4e55, $5e74, $2e93, $3eb2, $0ed1, $1ef0
  194.  
  195.     .ENDMOD
  196.  
  197.     .END
  198.